//  导入 axios
import axios from "axios";
import { Message } from "element-ui";
import store from "@/store";
import router from "@/router";
import { getTimeStamp } from "@/utils/auth";

// 创建一个 axios 副本
const instance = axios.create({
  // 设置开发环境基地址基地址
  baseURL: process.env.VUE_APP_BASE_API,
  // 超时时间
  timeout: 5000
});

// 设置请求拦截器
instance.interceptors.request.use(
  config => {
    // 从vuex中拿token
    const token = store.getters.token;
    // 拿到token过期的时间
    const timeOut = getTimeStamp();
    const currentTime = Date.now();

    if (token) {
      if (timeOut < currentTime) {
        // 主动介入判断token是否失效
        // 过期时间小于当前时间 表示token过期了 清除token 跳到登录页面
        store.dispatch("user/loginOut");
        const path = window.location.hash.substring(1);
        router.push(`/login?_redirect=${path}`); // 携带之前的地址跳转到登录页
        return Promise.reject(new Error("token失效"));     // return 错误
      }

      config.headers.Authorization = `Bearer ${token}`; // 在请求拦截中给每个请求头加token
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// 设置响应拦截器
instance.interceptors.response.use(
  response => {
    // 得到返回的数据
    const { data, message, success } = response.data;
    // 判断状态
    if (success) {
      // 网络请求正常的
      return data; // 经过这个return 将来网络请求得到的数据就是之前res.data中的数据
    } else {
      // 提示出错
      Message({
        message,
        type: "error"
      });
      // 返回网络请求错误
      return Promise.reject(new Error(message));
    }
  },
  error => {
    // return Promise.reject(error);
    // 被动处理token失效问题
    if (
      error.response &&
      error.response.data &&
      error.response.data.code === 10002
    ) {
      // 当code==10002表示 token过期
      store.dispatch("user/loginOut");
      // 保存当前页面的路径
      const path = window.location.href.split('#')[1]
      router.push(`/login?_redirect=${path}`); // 携带之前的地址跳转到登录页
    }else {
      Message.error(error.message)
    }
    return Promise.reject(error)
  }
);

export default instance;
